在STM32 CPU的架構裡面,CPU在和其他像是記憶體、DMA...等等的溝通時
資料會經由匯流排傳輸,匯流排就好像一台公交車,大家都得透過公車到達目的地
這很像甚麼?你知道大家的電視是怎麼連到第四台的嗎,概念類似電視台那邊釋出一條大的傳輸線
所有人你爸你媽你兄弟姊妹、子女、公公婆婆、岳父岳母、外公外婆、爺爺奶奶、五叔六嫂,四舅二伯、姑姑三姨、姊夫妹婿、外曾祖父母全部~全部的電視都連到電視台,第四台訊號就是匯流排,上面搭載著電視訊號。
下面一個CPU Bus架構的示意圖
如上圖,CPU(ARM Core)連著AHB(Advanced High-performance Bus) 再和其他RAM、DMA設備等等的這些高速的東西相連,再連到外面的那些周邊的裝置則是APB (Advanced Peripheral Bus)
這兩者有甚麼不同呢?
AHB(Advanced High-performance Bus)主要連接速度非常快、高性能的裝置
APB (Advanced Peripheral Bus)連接GPIO、TIMER這些外部的周邊裝置
CPU及CPU附近的裝置的速度非常非常快
但是周邊的速度遠遠不及CPU這類的速度啊!實在是太慢了!
所以AHB再通過Bridge提供一個慢速的IO裝置
今天準備介紹的GPIO就是屬於周邊的IO裝置,當CPU要跟IO做控制時會經過APB (Advanced Peripheral Bus)連到中間Bridge這個控制器,負責跟CPU溝通最後才到CPU手中。
GPIO(General Purpose Input/Output)是一種泛用型的輸入輸出裝置
可以當LED輸出,像上上篇範例的功能,也可以當按鈕的輸入
馬達控制,控制連續的High、Low變化產生PWM
當USB、USART...等等通訊協定的變化
可以想像是開關,user透過軟體可以自由打開關閉
每個GPIO可以是 input、output、analog或其他功能取決於要如何使用
所以總結來說它是一個通用型的,泛用型的輸入、輸出裝置。
下面是一個內部的結構方塊圖,我們主要看 GPIO PORT的部分
玩過8051的朋友應該知道GPIO就類似於8051的P0~P3
每一組IO都是8位元的暫存器,P0、P1、P2及 P3。
那在STM32L053R8這顆MCU裡面擁有五組GPIO的PORT
GPIOA、GPIOB、GPIOC、GPIOD和 GPIOH。而每一個PORT有16個bit
但並不是每個腳都是拿來做GPIO用,有些是拿來共用其他的功能,也有些是沒有拉出來的
那主要這塊板子能夠對外做GPIO跟外界溝通的只有GPIOA、GPIOB和GPIOC而已
還記得第二天提到過,現在使用的這塊開發版的腳位相容於Arduino的腳位
但這塊板子太強大了,若是只有使用Arduino的腳位就太浪費了
所以額外又多了更多的腳位
大家可以重新看到下面腳位的資訊
最常用的就是那些PB3、4、5或是PA5、6、7把這些IO拉出來做控制,達到我們要的效果
其實在這邊我們就可以看到不管是相容於原生Arduino的腳位還是完整開發版的腳位
每一個IO可能有不只一種功能,那既然一個引腳可以用於輸入、輸出或其他特殊功能
那麼一定有暫存器用來選擇這些功能,這部分後面會談到
GPIO腳位功能大致上可被設定為input(輸入)、output(輸出)、alternate function(特殊功能,比如pwm,timer,USART等等功能)或analog(類比)
通常在設置output的時候常會見到兩種模式:開漏(open-drain,漏極開路)和推輓(push-pull),這兩種模式差在哪裡呢?
間單來說Push-Pull內部有一個P-MOS和一個N-MOS兩個互補的MOSFET組成,當上面的電晶體導通,下面的電晶體關閉輸出高電位;反之,上面的電晶體截止,下面的電晶體導通,輸出低電位。所以這個Push-Pull的電壓是由自己提供,所以電壓轉換速度快,可以吸電流,也可以貫電流是他的優點。除非有需要高阻抗狀態,否則一般不需要額外的上拉電阻。
Open-Drain就是比Push-Pull少了上面那個電晶體,所以當下面的電晶體關閉,就輸出高電壓,但輸出是開路的,所以要加上拉電阻,則輸出的電壓就是由外界所提供,好處是外部電壓可以自己決定,改變上拉電阻的電壓,就可以調整邏輯High的準位。
名稱 | 電路 | 特點
------------- | -------------
Open-Drain開漏輸出 | | 1.可做電壓轉換-Level shift 2.Vo由外界提供,IC內部僅需很小的閘極驅動電流 3.可改變上拉電阻的電壓,調整邏輯High的準位。
Push-Pull推輓輸出 | | 1.可以吸電流。2.可以灌電流。3.輸出電壓由IC電源決定。
可以稍微看過GPIO在不同模式下的原理圖,這些資料可以在RM0367 Reference manual找到
When the I/O port is programmed as input:
When the I/O port is programmed as output:
When the I/O port is programmed as alternate function:
Note: The alternate function configuration described above is not applied when the selected alternate function is a LCD function. In this case, the I/O, programmed as an alternate function output, is configured as described in the analog configuration.
When the I/O port is programmed as analog configuration:
在STM32CubeMX設定引腳時,產生的程式碼中就已經幫我們配置好設定的GPIO的MODER、OTYPER、OSPEEDR、PUPDR這些暫存器。
這邊介紹幾個之後會常用到的GPIO暫存器
8051中要設定P0~P3的數值只需要把1組8位元的值丟給P0~P3,實際上就是在間接控制暫存器
GPIOx的每一組暫存器都是32位元,只需把數值丟到指定的暫存器即可
所以,以GPIO的某個引腳設定為任一MODER,以及設定甚麼TYPER,決定用內部推還是外部推,LED通常用內部推足夠了,然後決定上拉還是下拉來設定,最後是決定速度多快。
今天就到這裡
明天就要來玩模組啦
- STM32 Nucleo-64 boards (MB1136)資料手冊
https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf- STM32L053R8 datasheet
https://www.st.com/resource/en/datasheet/stm32l053r8.pdf- RM0367 Reference manual Ultra-low-power STM32L0x3 advanced Arm®-based 32-bit MCUs
https://www.st.com/resource/en/reference_manual/dm00095744-ultra-low-power-stm32l0x3-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf- ARM Mbed官網介紹 - NUCLEO-L053R8
https://os.mbed.com/platforms/ST-Nucleo-L053R8/- STM32 官網介紹 - STM32L053R8
https://www.st.com/en/microcontrollers-microprocessors/stm32l053r8.html#overview
- 此開發板售價在臺幣1000元以下,讀者可於以下網站購得:
https://www.mouser.tw/
https://www.digikey.tw/
嗯...
您好:
感謝您所提供學習資料,只是在[Open-Drain 與Push-Pull的電路比較:]這段落表格中,電路部分的圖示和上面段落所說的不同,煩請確認下,謝謝
好像是說明Open-Drain的時候使用了open-collector的圖說明